"""
在此之前先学习 列表 排序函数 (按照依据排序)
列表.sort( key=选择排序依据的函数, reverse=True | False)
参数 key 是要求传入一个函数,表示将列表的每一个元素传入函数中,返回排序的依据
参数 reverse是否反转排序结果 True降序  False升序(默认)
"""


列表 = [244, 5, 55, 79, 8]
列表.sort()  # 排序默认升序
print(列表)
列表.sort(reverse=True)  # 降序排序
print(列表)

# 还有一种特殊的排序方式,列表里嵌套列表的情况下怎么排序
列表 = [['a', 244], ['c', 5], ['b', 55], ['d', 79], ['e', 8]]

# 定义一个函数作为排序依据


def 排序依据(下标):
    return 下标[1]  # 列表第2个元素作为排序依据 就是嵌套列表里的第2个元素


# 以嵌套列表里的第2个元素,作为排序依据
列表.sort(key=排序依据, reverse=True)  # 排序默认升序   降序可以填入第2个参数 reverse=True
print(列表)


"""
选择正式开始柱状图构建
"""
# 记事本打开文件,文件编码是ANSI,就是跟随系统编码 本系统中文系统 编码 GB2312  .也可以输入这个
文件对象 = open("D:/python黑马/资料数据/1960-2019全球GDP数据.csv", "r", encoding="ANSI")
列表每一行 = 文件对象.readlines()
# print(列表每一行)

文件对象.close()
# 删除第一行
列表每一行.pop(0)
# print(列表每一行)

# 我们需要把列表变成字典
"""
我们需要把数据变成下面的写法 
{ 1960:[ [美国,50830],[中国,66630] ] }
"""

字典数据 = {}
for 元素 in 列表每一行:
    临时列表 = 元素.split(",")  # 分割字符串
    # 把年份取出来
    年份 = int(临时列表[0])  # 取出的是字符串,转换成为数字
    # 把国家名取出来
    国家 = 临时列表[1]
    # 把国家GDP数据取出来
    GDP数据 = float(临时列表[2])  # 数据里由于有科学计数法,要转换成浮点数

    # 下面开始写入字典
    try:
        # 年份 是密钥所以只能有一个,在检查到重复年份时,会报错.
        字典数据[年份].append([国家, GDP数据])
    except KeyError:
        字典数据[年份] = []   # 添加一个字典元素  元素形式这个是 { 年份:[] } ,这样的操作,年份 是密钥对应 空列表
        字典数据[年份].append([国家, GDP数据])  # 由于密钥对应的是 列表 所以可以使用列表操作 追加元素到后面.  这样循环依次追加入列表 列表套列表

# 可以看到字典数据是我们想要的结构了
# print(字典数据, f'\n数据类型是{type(字典数据)}')


"""
下面开始柱状图构建
先说明下,国家太多我们只要每年GDP前10名的 国家
所以要先对字典里,年份对应的列表 里的国家在排序,我们只要前10名的数据

"""
# 导入绘图包
from pyecharts.charts import Bar, Timeline
# 导入 系统配置 标签配置项.  画面动画(全局配置 )
from pyecharts.options import LabelOpts, AnimationOpts
# 导入功能(全局配置 )  标题和图例,工具箱,视觉映射
from pyecharts.options import TitleOpts, LegendOpts, ToolboxOpts, VisualMapOpts
# 导入主题
from pyecharts.globals import ThemeType


# 构建时间线,数据

# 先取出字典里年份,作为时间线的数据
年份列表 = 字典数据.keys()  # 年份是密钥,读取字典里所有的密钥
年份列表 = list(年份列表)  # 转换成列表
年份列表.sort()    # 列表排序 默认升序
# print(年份列表)


def GDP排序(下标):
    return 下标[1]


# 由于国家太多我们取前10名国家的GDP数据,作比较
每年各国数据 = []
for 年 in 年份列表:
    字典数据[年].sort(key=GDP排序, reverse=True)  # 字典密钥 对应的的是 列表,所以可以列表排序操作  这里是降序  GPD高的排第一
    # 读取前10名国家的数据
    前排国家和GDP = 字典数据[年][0:10:1]
    # print(前排国家和GDP)
    每年各国数据.append(前排国家和GDP)  # 综合存储各国每年的排名前10的数据, 形成列表  嵌套列表是一年排名的数据

# print(每年各国数据)
X轴_国名 = []
Y轴_GDP = []
for 每年数据 in 每年各国数据:
    国名 = []  # 列表有数据了,每次循环需要清空数据
    GDP = []
    for 元素 in 每年数据:
        国名.append(元素[0])
        GDP.append(int(元素[1] / 1_0000_0000))  # 我们的单位是亿,为了方便舍弃小数点
    # 国家 和 GDP 分别读取出来,存储到列表里  形成嵌套列表,每一个嵌套列表 对应一年的排名
    X轴_国名.append(国名)
    Y轴_GDP.append(GDP)

# print(X轴_国名)
# print(Y轴_GDP)

# 现在可以绘制时间线柱状图了

时间轴 = Timeline({'theme': ThemeType.CHALK})  # 参数是导入一个主题
# print(年份列表)

i = 0  # 设置一个终止条件  同时也是 下标
while i < len(年份列表):  # 年份列表 有多少个元素就循环多少次
    柱状图 = Bar()

    柱状图.add_xaxis(X轴_国名[i])
    柱状图.add_yaxis("GDP(亿)", Y轴_GDP[i], label_opts=LabelOpts(position="top"))  # 默认数字标签在里面,我们把标签放上面   right是右
    # 柱状图.reversal_axis()  # 反转柱状图 可以横过来看

    # 设置全局配置项
    柱状图.set_global_opts(
                            # 标题选项  pos是位置 left是左边 (这里我们顶部)  bottom是底部 (底部百分之1 )  top是 顶部
                            title_opts=TitleOpts(title=f"{年份列表[i]}年排名前10国家GDP", pos_left="top", pos_bottom="5%")
                        )

    # 把上面做好的图添加到当年时间轴里
    时间轴.add(柱状图, str(年份列表[i]))  # 时间轴第2给参数要求是 字符串

    i += 1   # 千万要记得终止条件啊,不然就是死循环了


# 添加时间轴一些设置
时间轴.add_schema(
                play_interval=1000,  # 动画播放间隔时间(毫秒)
                is_auto_play=True,  # 是否自动播放动画
                is_loop_play=False  # 是否循环播放
)

时间轴.render('1960年到2019年,各国GDP.html')
